const inquirer = require('inquirer')
const fs = require('fs-extra')
const shell = require('shelljs')
const moment = require('moment')
const print = require('../../lib/print')
const utils = require('../../lib/utils')
const git = require('../../lib/git')

// 模板项目名
const template_project = 'PROJECT'
const template_author = 'PROJECT_OWNER'
const template_date = 'TODAYS_DATE'
const template_year = 'TODAYS_YEAR'

// 目标项目地址
var projectPath = ''
var projectName = ''

module.exports = async function() {
    try {
        // 1.自定义 
        let answer = await inputParams()
        // 2.校验
        projectPath = `${answer.projectDir}/${answer.projectName}`
        projectName = answer.projectName
        checkValidProjectPath()
        // 3.拷贝模板
        cpTemplateToTarget()
        // 4.编译改文件
        modifyTemplate(projectPath)
        //
        print.successLog(`已创建 ${projectPath}`)
        shell.exec(`open ${projectPath}`)
    } catch (error) {
        print.errorLog(error)
    }
}

/*
 * 键盘输入部分，获取自定义信息
 */
function inputParams() {
    let promptList = [
        {
            type: "input",
            message: "请输入工程存放的目录：",
            name: "projectDir",
            default: process.cwd(),
            validate: function(val) {
                if(val.length) { // 校验是否有值
                    return true;
                }
                return '请输入有效的目录';
            }
        },
        {
            type: "input",
            message: "请输入工程名：",
            name: "projectName",
            validate: function(val) {
                if(val.length) { // 校验是否有值
                    return true;
                }
                return "请输入有效的工程名";
            }
        }
    ];
    return new Promise((resolve, reject) => {
        inquirer.prompt(promptList)
            .then(answer => {
                resolve(answer)
            })
    })
}

/*
 * 校验目标项目地址是否有效
 */
function checkValidProjectPath() {
    if (fs.existsSync(projectPath)) {
        throw `${projectPath} 目录已存在`
    }
    fs.mkdirSync(projectPath)
}

/*
 * 复制模板文件夹下的内容到目标路径下
 */
function cpTemplateToTarget() {
    // 资源模板
    let _templateProject = `${utils.getResourcesPath()}/create_ios_project/${template_project}`
    // 遍历复制
    shell.ls(_templateProject).forEach(element => {
        shell.cp('-r', `${_templateProject}/${element}`, projectPath)
    })
    print.successLog('已拷贝模板内容')
}

/*
 * 重点：遍历模板文件，执行重命名、替换操作
 */
function modifyTemplate(folder_path) {
    shell.ls(folder_path).forEach(element => {
        // 1. 重命名
        element = renameFile(element, folder_path)
        let element_path = `${folder_path}/${element}`

        let stat = fs.statSync(element_path)
        if (stat.isFile()) { // 文件
            // 2. 替换文件内容
            replaceFileContent(element_path)
        }else { // 文件夹
            // 递归查询
            modifyTemplate(element_path)
        }
    })
}

/*
 * 重命名文件、文件夹
 * 规则：
 * - 文件夹名称中包含 ${template_project} 则进行替换
 */
function renameFile(fileName, folderPath) {
    if (fileName.includes(template_project)) {
        let newFileName = fileName.replace(template_project, projectName)
        shell.mv(`${folderPath}/${fileName}`, `${folderPath}/${newFileName}`)
        print.successLog(`已重命名 ${folderPath}/${fileName} ==> ${folderPath}/${newFileName}`)
        return newFileName
    }
    return fileName
}

/*
 * 替换文件内容
 * 规则：
 * - ${template_project} 替换为 自定义的项目名
 * - ${template_author} 替换为 自定义的作者
 * - ${template_date} 替换为 当前年月日
 * - ${template_year} 替换为 当前年
 * 
 * 注意：
 * - / (斜杠)需要转义 \\/
 * - . (点)需要转义 \\.
 */
function replaceFileContent(filePath) {
    let cur_ymd = moment().format('YYYY/MM/DD')
    let cur_year = moment().format('YYYY')
    // 作者名称采用 git config 中的值
    let cur_author = git.userName()
    // 转义
    cur_ymd = cur_ymd.replace(/\//g, '\\/')
    cur_author = cur_author.replace(/\./g, '\\.')

    let modify_cmd = `sed -i "" ` + 
                     `-e 's/${template_author}/${cur_author}/g' ` + 
                     `-e 's/${template_project}/${projectName}/g' ` +
                     `-e "s/${template_date}/${cur_ymd}/g" ` +
                     `-e 's/${template_year}/${cur_year}/g' ` + 
                     `${filePath}`
    // 无法根据 shell 执行结果来判断文件是否有改动                     
    shell.exec(modify_cmd)
    print.successLog(`已替换 ${filePath}`)
}